﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.Entities;
using System.Data.SqlClient;
using System.Data;

namespace DAL
{
    public class CiudadDAL : DBController
    {
        public CiudadDAL()
        { 
        
        }

        /// <summary>
        /// Funcion que devuelve las ciudades
        /// </summary>
        /// <returns></returns>
        public List<CiudadEntity> GetCiudades()
        {
            try
            {
                List<CiudadEntity> ciudades = new List<CiudadEntity>();
                using (SqlConnection conn = this.OpenConn())
                {

                    SqlDataReader dr;

                    SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCiudades", conn);

                    dCmd.CommandText = "MARAVILLA_SQL.spGetCiudades";

                    dCmd.CommandType = CommandType.StoredProcedure;


                    // dCmd.ExecuteNonQuery();
                    dr = dCmd.ExecuteReader();
                    dCmd.Dispose();
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            /*intIdCiudad, varNombre,bitIsDeleted*/
                            CiudadEntity ciudad = this.BuildCiudad(dr);

                            ciudades.Add(ciudad);
                        }
                    }
                }
                return ciudades;

            }catch(Exception ex){
                throw ex;
            }
        }

        

        /// <summary>
        /// Funcion que devuelve las ciudades por cliente
        /// </summary>
        /// <returns></returns>
        public List<CiudadEntity> GetCiudadesByCliente(ClienteEntity _client)
        {
            try
            {
                List<CiudadEntity> ciudades = new List<CiudadEntity>();
                using (SqlConnection conn = this.OpenConn())
                {

                    SqlDataReader dr;

                    SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spGetCiudadesByCliente", conn);

                    dCmd.CommandText = "MARAVILLA_SQL.spGetCiudadesByCliente";

                    dCmd.CommandType = CommandType.StoredProcedure;

                    dCmd.Parameters.AddWithValue("@intIdCliente", _client.IntIdCliente);

                    // dCmd.ExecuteNonQuery();
                    dr = dCmd.ExecuteReader();
                    dCmd.Dispose();
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            CiudadEntity ciudad = this.BuildCiudad(dr);

                            ciudades.Add(ciudad);
                        }
                    }
                }
                return ciudades;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        /// <summary>
        /// Funcion que borra las ciudades de un cliente
        /// </summary>
        /// <returns></returns>
        public bool DeleteCiudadesFromCliente(ClienteEntity _cliente)
        {
            try
            {
                using (SqlConnection conn = this.OpenConn())
                {

                    SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spDeleteCiudadesFromCliente", conn);

                    dCmd.CommandText = "MARAVILLA_SQL.spDeleteCiudadesFromCliente";

                    dCmd.CommandType = CommandType.StoredProcedure;

                    dCmd.Parameters.AddWithValue("@intIdCliente", _cliente.IntIdCliente);

                    dCmd.ExecuteNonQuery();
                }
                return true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        

        /// <summary>
        /// Funcion que agrega las ciudades a un cliente
        /// </summary>
        /// <returns></returns>
        public bool AddCiudadToCliente(CiudadEntity _ciudad, ClienteEntity _cliente)
        {
            try
            {
                using (SqlConnection conn = this.OpenConn())
                {

                    SqlCommand dCmd = new SqlCommand("MARAVILLA_SQL.spAddCiudadToCliente", conn);

                    dCmd.CommandText = "MARAVILLA_SQL.spAddCiudadToCliente";

                    dCmd.CommandType = CommandType.StoredProcedure;

                    dCmd.Parameters.AddWithValue("@intIdCiudad", _ciudad.IntIdCiudad);
                    dCmd.Parameters.AddWithValue("@intIdCliente", _cliente.IntIdCliente);

                    dCmd.ExecuteNonQuery();
                }
                return true;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private CiudadEntity BuildCiudad(SqlDataReader dr)
        {
            CiudadEntity ciudad = new CiudadEntity();
            int i;

            i = dr.GetOrdinal("intIdCiudad");
            if (!dr.IsDBNull(i))
                ciudad.IntIdCiudad = dr.GetInt32(i);

            i = dr.GetOrdinal("varNombre");
            if (!dr.IsDBNull(i))
                ciudad.VarNombre = dr.GetString(i).Trim();

            i = dr.GetOrdinal("bitIsDeleted");
            if (!dr.IsDBNull(i))
                ciudad.BitIsDeleted = dr.GetBoolean(i);

            return ciudad;
        }
    }
}
